using System.Windows;
using System.Windows.Controls;
using LicenseApp.Client.Controls;

namespace LicenseApp.Client.Examples;

/// <summary>
/// 客户端应用集成示例窗口
/// 演示如何在客户端应用中集成授权管理控件
/// </summary>
public partial class SampleIntegrationWindow : Window
{
    public SampleIntegrationWindow()
    {
        InitializeComponent();
        InitializeApplication();
    }

    private void InitializeApplication()
    {
        // 初始化授权系统（正确的方式）
        InitializeLicenseSystem();

        // 订阅控件状态变化事件
        licenseControl.StatusChanged += LicenseControl_StatusChanged;

        // 初始状态检查
        CheckInitialAuthorizationStatus();
    }

    private void InitializeLicenseSystem()
    {
        try
        {
            // 1. 初始化授权系统
            // 应用程序路径获取 - 按要求实现
            string assemblyFilePath = System.Diagnostics.Process.GetCurrentProcess().MainModule?.FileName ?? "";
            string assemblyDirPath = System.IO.Path.GetDirectoryName(assemblyFilePath) ?? "";
            string publicKeyPath = System.IO.Path.Combine(assemblyDirPath, "public.xml");

            if (System.IO.File.Exists(publicKeyPath))
            {
                string publicKey = System.IO.File.ReadAllText(publicKeyPath);
                LicenseManager.Initialize(publicKey);
            }

            // 2. 设置通知器（自动弹窗提醒）
            LicenseManager.SetNotifier(new CustomWindowNotifier());

            // 3. 启动后台监控（正确的方式）
            bool monitorStarted = LicenseManager.StartLicenseMonitoring(
                OnLicenseStatusChanged,
                TimeSpan.FromMinutes(1)
            );

            if (!monitorStarted)
            {
                txtMainStatusBar.Text = "启动授权监控失败";
            }
        }
        catch (Exception ex)
        {
            txtMainStatusBar.Text = $"授权系统初始化失败: {ex.Message}";
        }
    }

    private void OnLicenseStatusChanged(LicenseStatusInfo statusInfo)
    {
        Dispatcher.BeginInvoke(() =>
        {
            // 更新主状态栏
            UpdateMainStatusBar(statusInfo);

            // 通知UI控件更新显示
            licenseControl?.OnExternalStatusChanged(statusInfo);

            // 处理业务逻辑
            HandleBusinessLogic(statusInfo);

            // 如果是新注册的授权，显示详细信息
            if (statusInfo.Status == LicenseStatus.Valid)
            {
                ShowLicenseInfoIfNeeded();
            }
        });
    }

    private void ShowLicenseInfoIfNeeded()
    {
        // 可以根据需要决定是否显示授权信息
        // 例如：首次注册成功后显示
    }

    private void HandleBusinessLogic(LicenseStatusInfo statusInfo)
    {
        // 根据授权状态控制应用功能
        switch (statusInfo.Status)
        {
            case LicenseStatus.Valid:
                EnableAllFeatures();
                break;
            case LicenseStatus.ExpiringSoon:
                // 通知器会自动弹出提醒
                break;
            case LicenseStatus.Expired:
                HandleExpiredLicense();
                break;
        }
    }

    private void CheckInitialAuthorizationStatus()
    {
        try
        {
            // 使用 LicenseManager 获取状态
            var status = LicenseManager.GetCurrentStatus();
            UpdateMainStatusBar(status);

            // 根据授权状态显示相应信息
            switch (status.Status)
            {
                case LicenseStatus.Valid:
                    // 授权有效，显示授权信息
                    ShowStartupLicenseInfo(status);
                    break;

                case LicenseStatus.ExpiringSoon:
                    // 即将到期，显示提醒和授权信息
                    ShowExpiringLicenseInfo(status);
                    break;

                case LicenseStatus.ExpiredGracePeriod:
                    // 宽限期，显示警告
                    ShowGracePeriodWarning(status);
                    break;

                case LicenseStatus.Expired:
                    // 已过期，询问是否进行授权管理
                    ShowExpiredLicensePrompt();
                    break;
            }
        }
        catch (Exception ex)
        {
            txtMainStatusBar.Text = $"授权检查失败: {ex.Message}";
        }
    }

    private void ShowStartupLicenseInfo(LicenseStatusInfo status)
    {
        var licenseInfo = LicenseManager.GetLicenseInfo();
        if (licenseInfo != null)
        {
            string message = $"欢迎使用！授权信息如下：\n\n" +
                           $"授权状态：有效\n" +
                           $"授权设备：{licenseInfo.AgvCount} 台AGV\n" +
                           $"生效日期：{licenseInfo.StartDate:yyyy-MM-dd}\n" +
                           $"到期日期：{licenseInfo.EndDate:yyyy-MM-dd}\n" +
                           $"剩余天数：{status.RemainingDays} 天";

            LicenseHelper.ShowNonBlockingDialog(
                "授权信息",
                message,
                LicenseDialogType.Information,
                this);
        }
    }

    private void ShowExpiringLicenseInfo(LicenseStatusInfo status)
    {
        var licenseInfo = LicenseManager.GetLicenseInfo();
        if (licenseInfo != null)
        {
            string message = $"授权即将到期！\n\n" +
                           $"授权状态：即将到期\n" +
                           $"授权设备：{licenseInfo.AgvCount} 台AGV\n" +
                           $"到期日期：{licenseInfo.EndDate:yyyy-MM-dd}\n" +
                           $"剩余天数：{status.RemainingDays} 天\n\n" +
                           $"请及时联系供应商续期！";

            LicenseHelper.ShowNonBlockingDialog(
                "授权即将到期",
                message,
                LicenseDialogType.Warning,
                this);
        }
    }

    private void ShowGracePeriodWarning(LicenseStatusInfo status)
    {
        var licenseInfo = LicenseManager.GetLicenseInfo();
        string message = $"🕐 授权已过期，但在宽限期内！\n\n";

        if (licenseInfo != null)
        {
            message += $"📅 到期日期：{licenseInfo.EndDate:yyyy-MM-dd}\n";
        }

        if (status.GracePeriod != null)
        {
            var graceHours = (int)status.GracePeriod.RemainingGraceTime.TotalHours;
            message += $"⏰ 宽限期剩余：{graceHours} 小时\n\n";
        }

        message += "请立即联系供应商续期！";

        LicenseHelper.ShowNonBlockingDialog(
            "授权过期警告",
            message,
            LicenseDialogType.Error,
            this);
    }

    private void ShowExpiredLicensePrompt()
    {
        var result = MessageBox.Show(
            "授权已过期，是否现在进行授权管理？",
            "授权提醒",
            MessageBoxButton.YesNo,
            MessageBoxImage.Warning);

        if (result == MessageBoxResult.Yes)
        {
            ShowLicenseManagementTab();
        }
    }

    private void LicenseControl_StatusChanged(LicenseStatusInfo statusInfo)
    {
        // 当授权状态发生变化时的处理
        UpdateMainStatusBar(statusInfo);

        // 根据状态执行相应的业务逻辑
        switch (statusInfo.Status)
        {
            case LicenseStatus.Valid:
                // 授权有效，可以正常使用所有功能
                EnableAllFeatures();
                break;

            case LicenseStatus.ExpiringSoon:
                // 即将到期，显示提醒但不限制功能
                ShowExpiringWarning(statusInfo.RemainingDays);
                break;

            case LicenseStatus.ExpiredGracePeriod:
                // 过期但在宽限期，显示紧急提醒
                ShowGracePeriodWarning();
                break;

            case LicenseStatus.Expired:
                // 完全过期，可以选择限制功能或显示续期界面
                HandleExpiredLicense();
                break;
        }
    }

    private void UpdateMainStatusBar(LicenseStatusInfo statusInfo)
    {
        var licenseInfo = LicenseManager.GetLicenseInfo();
        
        if (licenseInfo != null)
        {
            txtMainStatusBar.Text = $"授权状态: {GetStatusText(statusInfo.Status)} | " +
                                   $"AGV: {licenseInfo.AgvCount}台 | " +
                                   $"剩余: {statusInfo.RemainingDays}天 | " +
                                   $"检查时间: {DateTime.Now:HH:mm:ss}";
        }
        else
        {
            txtMainStatusBar.Text = $"授权状态: {GetStatusText(statusInfo.Status)} | " +
                                   $"检查时间: {DateTime.Now:HH:mm:ss}";
        }
    }

    private string GetStatusText(LicenseStatus status)
    {
        return status switch
        {
            LicenseStatus.Valid => "有效",
            LicenseStatus.ExpiringSoon => "即将到期",
            LicenseStatus.ExpiredGracePeriod => "已过期(宽限期)",
            LicenseStatus.Expired => "已过期",
            _ => "未知"
        };
    }

    private void EnableAllFeatures()
    {
        // 启用所有功能的示例代码
        // 在实际应用中，这里会启用各种业务功能
    }

    private void ShowExpiringWarning(int remainingDays)
    {
        // 非阻塞的到期提醒
        LicenseManager.ShowNotification(
            $"授权将在 {remainingDays} 天后到期，请及时续期",
            LicenseStatus.ExpiringSoon);
    }

    private void ShowGracePeriodWarning()
    {
        // 宽限期警告
        LicenseManager.ShowNotification(
            "授权已过期但在宽限期内，请立即联系供应商续期",
            LicenseStatus.ExpiredGracePeriod);
    }

    private void HandleExpiredLicense()
    {
        // 处理完全过期的情况
        var result = MessageBox.Show(
            "授权已过期，某些功能可能受到限制。\n\n是否现在进行授权续期？",
            "授权过期",
            MessageBoxButton.YesNo,
            MessageBoxImage.Warning);

        if (result == MessageBoxResult.Yes)
        {
            ShowLicenseManagementTab();
        }

        // 可以在这里添加功能限制逻辑
        // 例如：禁用某些按钮、限制AGV数量等
    }

    private void ShowLicenseManagementTab()
    {
        // 切换到授权管理标签页
        var tabControl = this.FindName("TabControl") as TabControl;
        if (tabControl != null && tabControl.Items.Count > 1)
        {
            tabControl.SelectedIndex = 1; // 选择授权管理标签页
        }
    }

    private void BtnShowLicenseManager_Click(object sender, RoutedEventArgs e)
    {
        ShowLicenseManagementTab();
    }

    private void BtnCheckAuthorization_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            // 手动检查授权状态
            licenseControl.RefreshLicenseStatus();

            var status = LicenseManager.GetCurrentStatus();
            var licenseInfo = LicenseManager.GetLicenseInfo();

            string message;
            if (licenseInfo != null)
            {
                message = $"授权状态: {GetStatusText(status.Status)}\n" +
                         $"生效日期: {licenseInfo.StartDate:yyyy-MM-dd}\n" +
                         $"到期日期: {licenseInfo.EndDate:yyyy-MM-dd}\n" +
                         $"AGV数量: {licenseInfo.AgvCount}台\n" +
                         $"剩余天数: {status.RemainingDays}天";
            }
            else
            {
                message = "未找到有效的授权信息，请先注册授权码。";
            }

            MessageBox.Show(message, "授权状态", MessageBoxButton.OK, MessageBoxImage.Information);
        }
        catch (Exception ex)
        {
            MessageBox.Show($"检查授权状态时发生错误: {ex.Message}", "错误",
                MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }

    private void BtnShowLicenseInfo_Click(object sender, RoutedEventArgs e)
    {
        try
        {
            // 使用 LicenseInfoHelper 获取格式化的授权信息
            string licenseInfo = LicenseInfoHelper.GetLicenseSummary();

            MessageBox.Show(licenseInfo, "详细授权信息", MessageBoxButton.OK, MessageBoxImage.Information);
        }
        catch (Exception ex)
        {
            MessageBox.Show($"获取授权信息时发生错误: {ex.Message}", "错误",
                          MessageBoxButton.OK, MessageBoxImage.Error);
        }
    }

    protected override void OnClosed(EventArgs e)
    {
        // 清理资源
        LicenseManager.StopMonitoring();
        base.OnClosed(e);
    }
}
